package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Calificacion;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.ICalificacionDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Curso
 */
public class SQLServerCalificacionDAO implements ICalificacionDAO {

    private static ResourceBundle rb;

    public SQLServerCalificacionDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Método que crea la calificacion de un alumno.
     * @author: Sara y Alvaro
     * @param rs
     * @return Devuelve la calificacion de la clase Calificacion
     */
    private Calificacion crearCalificacion(ResultSet rs) throws SQLException {
        Calificacion calificacion = new Calificacion();
        calificacion.setAluId(rs.getInt("AluId"));
        calificacion.setCurId(rs.getInt("CurId"));
        calificacion.setCalFch(rs.getTimestamp("CalFch"));
        calificacion.setCalNota(rs.getFloat("CalNota"));
        calificacion.setCalObserv(rs.getString("CalObserv"));

        return calificacion;
    }

    /**
     * Método que busca las calificaciones de un alumno en un curso.
     * @author
     * @param idAlumno, idCurso
     * @return  devuelve las calificaciones del alumno elegido en un curso
     */
    public ArrayList<Calificacion> buscarCalificacion(int idAlumno, int idCurso) throws GestorFormacionExcepcion {
        Calificacion calificacion = new Calificacion();
        ArrayList<Calificacion> calificaciones = new ArrayList<Calificacion>();
        Connection con = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = con.prepareStatement("SELECT AluId, CurId, CalFch, CalNota, CalObserv FROM calificacion WHERE AluId=? AND CurId=?");
            stmt.setInt(1, idAlumno);
            stmt.setInt(2, idCurso);
            ResultSet rs = stmt.executeQuery();

            while (rs.next()) {
                calificacion = crearCalificacion(rs);
                calificaciones.add(calificacion);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }

        return calificaciones;
    }

    /**
     * Método que busca las calificaciones de un alumno en un curso.
     * @author Sara y Adrian
     * @param idAlumno, idCurso
     * @return  devuelve las calificaciones del alumno elegido en un curso
     */
    public boolean buscarCalificacion(int idAlumno, int idCurso, Timestamp fecha) throws GestorFormacionExcepcion {
        boolean existe = false;
        Connection con = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = con.prepareStatement("SELECT AluId, CurId, CalFch, CalNota, CalObserv FROM calificacion WHERE AluId=? AND CurId=? AND CalFch=?");
            stmt.setInt(1, idAlumno);
            stmt.setInt(2, idCurso);
            stmt.setTimestamp(3, fecha);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                existe = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        return existe;
    }

    /**
     * Método que crea la calificacion de un alumno
     * @author
     * @param objeto Calificacion
     */
    /**
     * Método que crea las calificaciones de un alumno en un curso.
     * @Aitor y Xarles
     * @param Recibe una calificacion de tipo Calificacion.
     * @return No devuelve nada.
     */
    public void crearCalificacion(Calificacion calificacion) throws GestorFormacionExcepcion {
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {
            PreparedStatement stmt = con.prepareStatement("INSERT INTO Calificacion (AluId, CurId, CalFch,CalNota,CalObserv) VALUES(?,?,?,?,?)");
            stmt.setInt(1, calificacion.getAluId());
            stmt.setInt(2, calificacion.getCurId());
            stmt.setTimestamp(3, calificacion.getCalFch());
            stmt.setFloat(4, calificacion.getCalNota());
            stmt.setString(5, calificacion.getCalObserv());
            stmt.executeUpdate();
            stmt.close();

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }


    }

    /**
     * Método que borra las calificaciones.
     * @author
     * @param ArrayList de calificaciones
     */
    /**
     * Método que borra las calificaciones de un alumno en un curso.
     * @Aitor y Xarles
     * @param Recibe un array de calificaciones.
     * @return No devuelve nada.
     */
    public void borrarCalificacion(ArrayList<Calificacion> calificacion) throws GestorFormacionExcepcion {
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }
        try {


            for (int i = 0; i < calificacion.size(); i++) {
                PreparedStatement stmt = con.prepareStatement("DELETE FROM Calificacion WHERE AluId=? AND CurId=? AND CalFch=?");
                stmt.setInt(1, calificacion.get(i).getAluId());
                stmt.setInt(2, calificacion.get(i).getCurId());
                stmt.setTimestamp(3, calificacion.get(i).getCalFch());
                stmt.executeUpdate();
                stmt.close();
            }

        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCalificacionDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }


    }
}
